package com.tsmti.core.common.service;

import com.tsmti.core.common.data.DuplicateValid;
import com.tsmti.core.common.query.data.Page;
import com.tsmti.core.common.query.data.Pageable;
import com.tsmti.core.common.query.data.Queryable;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * Title：PimsSystem
 * Class：com.tsmti.core.base
 * Comapny:
 *
 * @author：zcw
 * @version：2.5 CreateTime：2017/12/29 15:57
 * Modify log:
 * Description：
 */
public interface BaseService<T  extends Serializable> {

    /**
     * 保存
     * @param entity
     * @return
     */
    T save(T entity);

    /**
     * 批量保存
     * @param entitys
     */
    void saveAll(List<T> entitys);

    /**
     * 批量保存返回列表
     * @param entitys
     * @return
     */
    List<T> saveList(List<T> entitys);

    /**
     * 更新
     * @param entity
     */
    void saveOrUpdate(T entity);

    /**
     * 更新
     * @param entity
     */
    void update(T entity);


    /**
     * 主键获取
     * @param id
     * @return
     */
    T load(Serializable id);

    /**
     * 主键获取实体
     * @param id
     * @return
     */
    T get(Serializable id);

    /**
     * 属性获取实体
     * @param propertyName
     * @param value
     * @return
     */
    T get(String propertyName, Object value);

    /**
     * 实体是否存在
     * @param id
     * @return
     */
    Boolean exists(Serializable id);

    /**
     * 记录数
     * @return
     */
    Long count();

    /**
     * 记录数
     * @param detachedCriteria
     * @return
     */
    Long count(DetachedCriteria detachedCriteria);

    /**
     * 记录数
     * @param criterions
     * @return
     */
    Long count(Criterion... criterions);

    /**
     * 查找记录
     * @return
     */
    List<T> list();

    /**
     * 查找记录
     * @param propertyName
     * @param value
     * @return
     */
    List<T> list(String propertyName, Object value);

    /**
     * 查找记录
     * @param orderType
     * @param orderName
     * @return
     */
    List<T> listByOrder(String orderType, String orderName);

    /**
     * 查找记录
     * @param detachedCriteria
     * @return
     */
    List<T> list(DetachedCriteria detachedCriteria);

    /**
     * 查找记录
     * @param criterions
     * @return
     */
    List<T> listByCriterion(Criterion... criterions);

    /**
     * 查找记录
     * @param orderType
     * @param orderName
     * @param criterions
     * @return
     */
    List<T> listByCriterion(String orderType, String orderName, Criterion... criterions);

    /**
     * 分页查找记录
     * @param page
     * @param rows
     * @param criterions
     * @return
     */
    List<T> listByCriterion(int page, int rows, Criterion... criterions);

    /**
     * 分页查找记录
     * @param page
     * @param rows
     * @param orderType
     * @param orderName
     * @param criterions
     * @return
     */
    List<T> listByCriterion(int page, int rows, String orderType, String orderName, Criterion... criterions);

    /**
     * 分页查找
     * @param page
     * @param rows
     * @param detachedCriteria
     * @return
     */
    List<T> list(int page, int rows, DetachedCriteria detachedCriteria);

    /**
     * 分页查找
     * @param pageable
     * @param detachedCriteria
     * @return
     */
    Page<T> list(Pageable pageable, DetachedCriteria detachedCriteria);

    /**
     * 分页查找
     * @param queryable
     * @param detachedCriteria
     * @return
     */
    Page<T> list(Queryable queryable, DetachedCriteria detachedCriteria);

    /**
     * 不分页查找
     * @param queryable
     * @param detachedCriteria
     * @return
     */
    List<T> listWithNoPage(Queryable queryable, DetachedCriteria detachedCriteria);

    /**
     * 删除
     * @param entity
     */
    void remove(T entity);

    /**
     * 根据主键删除
     * @param id
     */
    void removeById(Serializable id);

    /**
     * 批量删除
     * @param entitys
     */
    void removeAll(List<T> entitys);

    /**
     * 根据主键批量删除
     * @param ids
     */
    void removeAllById(List<?> ids);

    /**
     * 指定属性删除
     * @param propertyName
     * @param value
     */
    void removeAllByProperty(String propertyName, Object value);

    /**
     * 更新
     * @param hql
     * @param params
     * @return
     */
    int updateByHql(final String hql, final Object... params);

    /**
     * 更新
     * @param hql
     * @param alias
     * @return
     */
    int updateByAliasHql(final String hql, final Map<String, Object> alias);

    /**
     * 获取记录数
     * @param hql
     * @param params
     * @return
     */
    Long countByHql(final String hql, final Object... params);

    /**
     * 获取记录数
     * @param hql
     * @param alias
     * @return
     */
    Long countByAliasHql(final String hql, final Map<String, Object> alias);

    /**
     * HQL查找
     * @param hql
     * @param params
     * @return
     */
    List<T> findByHql(final String hql, final Object... params);

    /**
     * HQL查找
     * @param hql
     * @param alias
     * @return
     */
    List<T> findByAliasHql(final String hql, final Map<String, Object> alias);

    /**
     * HQL分页查找
     * @param hql
     * @param page
     * @param rows
     * @param params
     * @return
     */
    List<T> findByHql(final String hql, int page, int rows, final Object... params);


    /**
     * HQL分页查找
     * @param hql
     * @param page
     * @param rows
     * @param alias
     * @return
     */
    List<T> findByAliasHql(final String hql, int page, int rows, final Map<String, Object> alias);

    /**
     * HQL查找
     * @param hql
     * @param params
     * @return
     */
    List<Map<String, Object>> findMapByHql(final String hql, final Object... params);

    /**
     *  HQL查找
     * @param hql
     * @param alias
     * @return
     */
    List<Map<String, Object>> findMapByAliasHql(final String hql, final Map<String, Object> alias);

    /**
     * 字段校验
     * @param duplicateValid
     * @return
     */
    Boolean doValid(DuplicateValid duplicateValid);
}
